// 路由鉴权：鉴权，项目中路由能不能被访问的权限设置（某个路由什么条件可以访问、什么条件不能访问）
import router from '@/router'
import nprogress from 'nprogress'
// 引入nprogress样式
import 'nprogress/nprogress.css'
// 获取用户相关的小仓库内部token数据，用来判断用户登陆状态
import { useUserStore } from '@/stores/modules/user'
import pinia from '@/stores'
import {setting} from '@/setting'

nprogress.configure({ showSpinner: false })

const userStore = useUserStore(pinia);

// 路由全局守卫：项目当中任意路由切换都会触发的钩子
// 全局前置守卫
router.beforeEach(async(to, _, next) => { 
    // to: 访问路由对象
    // from: 离开路由对象
    // next: 放行函数
    nprogress.start();
    const token = userStore.token;
    const username = userStore.username;
    if (token) { 
        // 登陆成功，访问login路由，强制跳转到首页
        if (to.path === '/login') {
            next('/')
        } else {
            // 登陆成功，访问其他路由，如果有用户信息放行
            if (username) {
                // 放行路由
                next()
            } else { 
                try {
                    // 用户未登陆，如果没有用户信息，请求用户信息
                    await userStore.userInfo();
                    // 放行路由
                    next();
                } catch (error) {
                    // 获取用户信息失效的情况：token过期或者token被修改
                    // 这时候需要退出登陆，然后重定向到login路由 
                    await userStore.logout()
                    next({path:'/login', query:{redirect: to.path}})
                }
            }
        }
    } else { 
        // 用户未登陆，如果访问login路由，放行
        if (to.path === '/login') {
            next()
        } else { 
            // 用户未登陆，访问其他路由，强制跳转到login路由, 并且带上登陆前要去的地址
            next({path:'/login', query:{redirect: to.path}})
        }
    }
})

// 全局路由后置守卫
router.afterEach((to, _) => { 
    // to: 访问路由对象
    // from: 离开路由对象
    document.title = `${setting.title}-${to.meta.title}`
    nprogress.done();
})  